package model;

import java.awt.Graphics;
import java.util.*;

import javax.swing.JLabel;

import vue.FenetrePrincipale;
import vue.Grille;
import vue.West;

/**
 * Class Personnages est la classe mère de toutes les classes du jeu
 *  l'attribut position donne la case où se situe la pièce
 * l'attribue E est un lien vers le FenetrePrincipal
 * cela permet d'avoir accès aux autres cases
 * l'attribut isBlue permet de tester quelle est la couleur de la piece (bleu ou rouge)
 */
abstract public class Personnage {

	//
	// Fields
	//

	private int precision;
	private int vitalite;
	protected int force;
	private int heritage;
	protected Case position;
	protected Direction direction;
	private int points;
	private int vitesse = 1;
	private final Joueur joueur;
	private String chemainFichierImage;
	protected List<Case> caseAccessible;
	protected List<Case> caseAttaquable;
	

	
		
	//private West west;

	//
	// Constructors
	//
	public Personnage(Case c, Joueur joueur, int vitalite_) {
		position=c;
		this.joueur=joueur;
		this.vitalite=vitalite_;
		caseAccessible = new ArrayList<Case>();
		caseAttaquable = new ArrayList<Case>();
	}
	public Personnage() {
		this(null,null,0);
	}
	
	public Joueur getJoueur() {
		return joueur;
	}
	
	public void setPrecision(int newVar) {
		precision = newVar;
	}
	
	public int getPrecision() {
		return precision;
	}
	public void setVitalite(int newVar) {
		vitalite = newVar;
	}

	public int getVitalite() {
		return this.vitalite;
	}
	public void setForce(int newVar) {
		force = newVar;
	}
	public int getForce() {
		return force;
	}

	public void setHeritage(int newVar) {
		heritage = newVar;
	}

	public int getHeritage() {
		return heritage;
	}

	public void setPosition(Case newVar) {
		position = newVar;
	}

	public model.Case getPosition() {
		return position;
	}

	public void setDirection(Direction newVar) {
		direction = newVar;
	}
	public model.Direction getDirection() {
		return direction;
	}
	public void setPoints(int newVar) {
		points = newVar;
	}
	public int getPoints() {
		return points;
	}

	/**Cette méthode teste si la pièce à déplacer est de la couleur 
	 * de l'équipe qui doit jouer puis elle vérifie que la case destination 
	 *  ne contient pas une pièce de la même équipe : on ne mange pas les pièces de sa propre équipe
	 *  
	  */
	
	/**  // la méthode moveOk teste si le déplacement est valide
	 * cette méthode devra être enrichie dans les classes filles pour 
     *  prendre en compte les règles de déplacement spécifique
     *  � metre dans le co,ntrpoleur
   */

	/** la méthode ToString est utilisée 
     * pour afficher le nom de la pièce dans sa case
     * le nom de la pièce étant spécifique, cette méthode est abstraite
     */
    public abstract String ToString();

	public List<Case> getCaseAccessible() {
		caseAccessible = new ArrayList<Case>();
		for (int i=-getVitesse();i<=getVitesse();i++) {
			for (int j=-getVitesse();j<=getVitesse();j++) {
				Case laCase = position.getCaseDistante(i, j);
				if(laCase!=null && position.getDistance(laCase)<=getVitesse()) {
					caseAccessible.add(laCase);
				}
			}
		}
		
		return caseAccessible;
	}

	public List<Case> getCaseAttaquable() {
		caseAttaquable = new ArrayList<Case>();
		for (int i=-1;i<=1;i++) {
			for (int j=-1;j<=1;j++) {
				Case laCase = position.getCaseDistante(i, j);
				if (laCase!=null)
					caseAttaquable.add(laCase);
			}
		}
		return this.caseAttaquable;
	}

	public String getChemainFichierImage() {
		return chemainFichierImage;
	}

	public void setChemainFichierImage(String chemainFichierImage) {
		this.chemainFichierImage = chemainFichierImage;
	}
	public void attaquer(Case c) {
		if ((int)Math.random()*100<=precision) {
			c.getPerso().setVitalite(c.getPerso().getVitalite() - this.getForce());
			Joueur j =c.getPerso().getJoueur();
			if (c.getPerso().getVitalite()<=0) {
				c.removePiece();
				
			}
			j.notifier();
		}
	}
	public int getVitesse() {
		return vitesse;
	}
	public void setVitesse(int vitesse) {
		this.vitesse = vitesse;
	}
    
    
    //abstract public void seDeplacer();

	/**
   */
	//abstract public void attaquer();
    
    /**
     * renvoi les cases accessible.
     */
}